package org.zhxy.zhxy.controller.backend;


import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.annotations.Update;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.bind.annotation.*;
import org.zhxy.zhxy.dao.AdminDao;
import org.zhxy.zhxy.entity.Admin;
import org.zhxy.zhxy.entity.User;
import org.zhxy.zhxy.service.AdminService;
import org.zhxy.zhxy.utils.MD5Utils;
import org.zhxy.zhxy.utils.PageResult;
import org.zhxy.zhxy.utils.RedisConstants;
import org.zhxy.zhxy.utils.Result;

import javax.annotation.Resource;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 管理员表(Admin)表控制层
 *
 * @author yayong
 * @since 2024-10-19 20:25:46
 */
@RestController
@RequestMapping("/api/admin")
@Slf4j
public class AdminController {

    /**
     * 服务对象
     */
    @Resource
    private AdminService adminService;

    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    // 定义一个处理 GET 请求的方法，映射到 /admin/list 路径

    /**
     * 分页查询所有用户
     */
    @GetMapping("/getAdminList")
    public Result listAdmin(int page, int pageSize) {
        Page<Admin> userPage = adminService.query()
                .page(new Page<>(page, pageSize));
        List<Admin> userList = userPage.getRecords().stream()
                .peek(user -> user.setPassword(null))
                .collect(Collectors.toList());
        PageResult<Admin> pageResult = new PageResult<>(userPage.getTotal(), userList);
        return Result.success(pageResult);
    }

    //添加管理员
    @PostMapping("/addAdmin")
    public Result addAdmin(@RequestBody Admin admin) {
        // 检查用户名是否已存在
        if (adminService.usernameExists(admin.getUsername())) {
            return Result.fail("用户名已存在");
        }

        // 密码加密
        if (admin.getPassword() != null) {
            admin.setPassword(MD5Utils.encodeByMd5WithCipher(admin.getPassword()));
        }

        // 设置创建时间
        admin.setCreateTime(new Date());

        if (admin.getImage() == null) {
            admin.setPassword(MD5Utils.encodeByMd5WithCipher(admin.getPassword()));
        }

        // 插入管理员
        return adminService.save(admin) ? Result.success() : Result.fail("新增管理员失败");
    }

    //删除管理员
    @GetMapping("/DeleteAdmin")
    public Result deleteAdmin(@NotEmpty(message = "id不能为空") Integer id) {
        return adminService.removeById(id) ? Result.success() : Result.fail("删除用户失败");
    }

    //更新管理员信息
    @PostMapping("/UpdateAdmin")
    public Result updateAdmin(@RequestBody Admin admin) {
        if (admin.getPassword() != null) {
            admin.setPassword(MD5Utils.encodeByMd5(admin.getPassword()));
        }
        admin.setUpdateTime(new Date());
        return adminService.updateById(admin) ? Result.success() : Result.fail("修改用户失败");
    }

    //更新管理员信息
    @GetMapping("/FindAdmin")
    public Result FindAdmin(String username, @NotNull(message = "页码不能为空") int page, @NotNull(message = "页码不能为空") int pageSize) {
        // 执行分页查询，获取符合条件的管理员列表
        Page<Admin> adminPage = adminService.query() // 调用 adminService 的查询方法，获取查询构建器
                .like("username", "%" + username + "%") // 使用 like 条件查询，查找包含指定用户名的记录
                .page(new Page<>(page, pageSize)); // 进行分页操作，指定当前页和每页大小

        // 获取查询结果中的记录，并处理每个 Admin 对象
        List<Admin> adminList = adminPage.getRecords().stream() // 从查询结果中获取记录列表，并转为流进行处理
                .peek(admin -> admin.setPassword(null)) // 对每个 Admin 对象执行操作，将密码设为 null，避免返回敏感信息
                .collect(Collectors.toList()); // 收集处理后的结果为一个列表

        // 创建一个分页结果对象，包含总记录数和处理后的管理员列表
        PageResult<Admin> pageResult = new PageResult<>(adminPage.getTotal(), adminList); // 包装分页结果

        // 返回成功结果，包含分页信息
        return Result.success(pageResult); // 返回包含分页结果的成功响应

    }

    /**
     * 修改管理员头像
     */
    @PostMapping("/updateAdminImage")
    public Result updateAdminImage(@RequestBody Admin admin) {
        Integer id = admin.getId();
        String imageUrl = admin.getImage();
        if (id == null) {
            return Result.fail("管理员id不能为空");
        }
        if (StrUtil.isBlank(imageUrl)) {
            return Result.fail("头像url不能为空");
        }
        Admin admin1 = adminService.getById(id);
        if (ObjectUtil.isNull(admin1)) {
            return Result.fail("管理员不存在");
        }
        Admin forUpdate = new Admin();
        forUpdate.setId(id);
        forUpdate.setImage(imageUrl);
        return adminService.updateById(admin) ? Result.success("修改管理员头像成功") : Result.fail("修改管理员头像失败");
    }

    /**
     * 修改管理员邮箱
     */
    @PostMapping("/updateAdminEmail")
    public Result updateAdminEmail(@RequestBody Admin admin, @RequestParam("code") String code) {
        Integer id = admin.getId();
        String email = admin.getEmail();
        log.info("admin：{}",admin);
        log.info("code：{}",code);
        if (id == null) {
            return Result.fail("管理员id不能为空");
        }
        if (StrUtil.isBlank(email)) {
            return Result.fail("邮箱不能为空");
        }
        if (StrUtil.isBlank(code)) {
            return Result.fail("验证码不能为空");
        }
        Admin admin1 = adminService.getById(id);
        if (ObjectUtil.isNull(admin1)) {
            return Result.fail("管理员不存在");
        }
        String redisKey = RedisConstants.ADMIN_CODE + email;
        String redisCode = stringRedisTemplate.opsForValue().get(redisKey);
        if (StrUtil.isBlank(redisCode)) {
            return Result.fail("验证码已过期或未发送验证码");
        }
        if (!code.equals(redisCode)) {
            return Result.fail("验证码不正确");
        }
        Admin forUpdate = new Admin();
        forUpdate.setId(id);
        forUpdate.setEmail(email);
        boolean is = adminService.updateById(admin);
        if(is){
            stringRedisTemplate.delete(redisKey);
            return Result.success("修改管理员邮箱成功");
        }else{
            return Result.fail("修改管理员邮箱失败");
        }
    }
}

